/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Interface;

import javax.swing.JPanel;

/**
 * Le jeu. Contient le thread qui fait bouger et apparaître tous les éléments du monde.
 * @author Laurent/Pascal
 */
public class Jeu extends JPanel {

    boolean isPaused = false;
    Monde monde = new Monde(this);
    Thread threadJeu = new Thread() {

        /**
         * Met à jour l'affichage du monde.
         */
        @Override
        public synchronized void run() {

            while (true) {
                while (!isPaused) {
                    majJeu();
                    repaint();
                    revalidate();

                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                        System.exit(1);
                    }

                }

            }
        }
    };

    /**
     * Constructeur de la classe. Démarre les threads.
     */
    public Jeu() {
        setLayout(null);
        add(monde);
        this.setSize(1024, 756);
        setLocation(0, 0);
        threadJeu.start();
        monde.threadExplosions.start();

    }

    /**
     * À chaque itération du thread, fait apparaître les éléments du jeu, les
     * déplace et détecte les collisions avec les projectiles.
     */
    public void majJeu() {
        monde.spawnOvnis();
        monde.spawnBibittes();
        monde.spawnPowerUps();
        monde.bougerElements();
        monde.detectionCollisions();



    }

    /**
     * Met le thread du jeu à pause ou le repart.
     */
    public void pauseJeu() {
        if (!isPaused) {
            isPaused = true;
        } else {
            isPaused = false;
        }
    }

    /**
     * Va chercher le pointage de la partie en cours.
     * @return pointage
     */
    public int getPoints() {
        return monde.getPointage();
    }

    /**
     * Va chercher le nom du power-up en attente.
     * @return type du power-up
     */
    public String getNomPowerUp() {
        return monde.getNomPowerUp();
    }

    /**
     * Au début la partie, remet le monde à zéro et active la souris.
     */
    public void resetMonde() {
        monde.frequenceBibitte=monde.frequenceBibitteDefault;
        monde.frequenceOvni=monde.frequenceOvniDefault;
        monde.frequenceSuperOvni=monde.frequenceSuperOvniDefault;
        monde.algorithmeDeDifficulte.setCompteur(0);
        monde.toutEnlever();
        monde.killCount=1;
        monde.killMineurs=0;
        monde.powerUpsUtilise=0;
        if (!monde.sourisOn) {
            monde.sourisOn = true;
        }
    }

    /**
     * Désactive ou réactive la possibilité de tirer avec la souris (pour quand le jeu est mis à pause).
     */
    public void pauseSouris() {
        if (monde.sourisOn) {
            monde.sourisOn = false;
        } else {
            monde.sourisOn = true;
        }
    }

    /**
     * Active ou désactive le mode prototype.
     */
    public void modePrototype() {
        if (!monde.prototype) {
            monde.prototype = true;
        } else {
            monde.prototype = false;
        }
        monde.modePrototype();

    }

    /**
     * Va chercher le nom du dernier trophée obtenu par le joueur.
     * @return nom du trophée.
     */
    public String dernierAchievement() {
        return monde.dernierAchievement();
    }

    /**
     * Affiche le tableau des pointages dans un JOptionPane.
     */
    public void afficherScores() {
        monde.afficherScores();
    }

    /**
     * Affiche les trophées dans un JOptionPane.
     */
    public void afficherAchievements() {
        monde.afficherAchievements();
    }

    /**
     * Vérifie si le jeu est à pause.
     * @return True si le jeu est à pause.
     */
    public boolean getPaused() {
        return isPaused;
    }
    /**
     *
     * @return Renvoit le niveau de difficulté string
     */
    public String getNiveauDiff() {
       return monde.getNiveauDif();
    }
    /**
     *
     * @return Renvoit le niveau de difficulté int
     */
    public int getCompteurDif() {
        return monde.getCompteurDif();
    }
}
